package s.k.gui.webtest.data.provider;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.poi.ss.usermodel.Sheet;

public class ExcelDataProvider implements Iterator<Object[]>{
	private ExcelDataTools data;
	private Sheet sheet;
	//private Row row;
	private int rows;
	//数据要读取的当前行
	//private int curRow=1;
	private Object[] columnName;
	private int columnNum;
	//数据读取的理论当前的物理行。实际的行数已经被合并了。
	 private int curPhysicalRowNo = 1;
	public ExcelDataProvider(String className,String methodName){
		data=new ExcelDataTools();
		try{
			this.sheet=data.getExcel(new FileInputStream(data.getPathBycontains("D:\\",className))).getSheet(methodName);
			System.out.println("数据文件在系统的d:\\"+className+".xls的位置");
			data.setSheet(sheet);
			data.setRow(data.getRow(0));
			this.rows=data.getAllRows().size();
			this.columnNum=data.getAllcellsByRow().size();
			System.out.println("总共有"+columnNum+"个参数化的字段");
			columnName = new String[columnNum];
			for(int i=0;i<columnNum;i++){
				data.setCell(data.getAllcellsByRow().get(i));
				System.out.println("Excel字段的属性：");
				columnName[i]=data.getData(i);
			}		
			System.out.println("-------------构造数据驱动完毕！------------");	
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	@Override
	public boolean hasNext() {
		if(this.rows==0||this.curPhysicalRowNo>=this.rows){
			return false;
		}
		return true;
	}
	@Override
	public Object[] next() {
		//data.setRow(data.getRow(this.curPhysicalRowNo));
		Map<Object,ArrayList<Object>> s = new HashMap<Object,ArrayList<Object>>();
		int RangeRow =1;
		boolean isRangeRow = false;
		//data.getMergedRegionList(0);
		//判断得到的区域内是否在当前的物理行内，如果在的得到这个合并单元格的高度。并且跳出循环，等待下一次迭代的时候再进行判断
		for(int i = 0;i<data.getMergedRegionList(0).size();i++){
			if(data.getMergedRegionList(0).get(i).getFirstRow()==this.curPhysicalRowNo){
				RangeRow=data.getMergedRegionList(0).get(i).getLastRow()-data.getMergedRegionList(0).get(i).getFirstRow()+1;
				isRangeRow=true;
				break;
			}
		}
		
		/**
		 * 因为行和cell的值都是变化的，所以动态的注入属性需要在循环内进行。动态的注入当前row为当前的物理行！
		 * @return Object的数组，符合testNg的参数格式，可以用map去取出需要的参数名字。
		 * */
		for(int i=0;i<columnNum;i++){
			ArrayList<Object> temp = new ArrayList<Object>();
			try{	
				if(isRangeRow){
					data.setRow(data.getRow(this.curPhysicalRowNo));
					data.setCell(data.getCell(i));
					if(i==0){
						temp.add(data.getData());
					}else{
						for(int j=0;j<RangeRow;j++){
							data.setRow(data.getRow(this.curPhysicalRowNo+j));
							data.setCell(data.getCell(i));
							temp.add(data.getData());
						}
					}				
				}else{
					data.setRow(data.getRow(this.curPhysicalRowNo));
					data.setCell(data.getCell(i));
					temp.add(data.getData());
				}
			}catch(NullPointerException e){
				System.out.println("此属性["+this.columnName[i]+"]下没有参数，设置默认参数为空！默认的参数可能会影响你的程序运行，建议你修改你的参数文件！");
				temp.add("");
			}
			s.put(this.columnName[i], temp);
			
		}
		Object r[]=new Object[1];
		r[0]=s;
		this.curPhysicalRowNo = this.curPhysicalRowNo + RangeRow;	
		return r;
	}
	@Override
	public void remove() {
		// TODO Auto-generated method stub
		
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}
